# encoding=utf-8

import warnings

warnings.filterwarnings('ignore')
#显示中文
from pylab import *  #显示中文

mpl.rcParams['font.sans-serif'] = ['SimHei']  #显示中文
#画图中显示负号
import matplotlib

matplotlib.rcParams['axes.unicode_minus'] = False

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn import datasets
from sklearn.preprocessing import StandardScaler,PolynomialFeatures
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.linear_model import Lasso,Ridge
from sklearn.model_selection import cross_val_score,GridSearchCV, train_test_split

# sklearn中boston数据集--------波士顿房价数据集包含506组数据，每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率、一氧化氮浓度、住宅平均房间数、到中心区域的加权距离以及自住房平均房价等。因此，波士顿房价数据集能够应用到回归问题上。
# 1、	加载数据（5分）
boston = datasets.load_boston()
# 2、	提取数据（5分）
X, y = boston.data, boston.target
# 3、	对数据进行规范化处理（10分）
sc = StandardScaler()
sc_X = sc.fit_transform(X)
# 4、	使用留出法切分数据7.5:2.5（10分）
X_train, X_test, y_train, y_test = train_test_split(sc_X, y, test_size=0.25, random_state=0)
# 5、	网格搜索交叉验证（20分）
# a)	创建L1模型
lasso = Lasso()
# b)	正则化率分别为0.01， 0.05， 0.1， 0.5， 1
param_grid = {"alpha": [0.01, 0.05, 0.1, 0.5, 1]}

# c)	交叉验证为5折
grid_search = GridSearchCV(lasso,param_grid,cv=5)
# d)	使用训练集训练数据
grid_search.fit(X_train,y_train)
# e)	打印最优得分，和最优参数
print(grid_search.best_score_)
print(grid_search.best_params_)
# 6、	使用最优参数，创建L1模型，训练数据，进行预测，打印mse，和R方（10分）
lasso = Lasso(alpha=0.1)
lasso.fit(X_train,y_train)
pred_test = lasso.predict(X_test)
print('mse:', mean_squared_error(y_test, pred_test))
print('r2:', r2_score(y_test, pred_test))
# 7、	如上5内容相同，进行L2网格搜索交叉验证处理（20分）


# a)	创建L1模型
ridge = Ridge()
# b)	正则化率分别为0.01， 0.05， 0.1， 0.5， 1
param_grid = {"alpha": [0.01, 0.05, 0.1, 0.5, 1]}

# c)	交叉验证为5折
grid_search = GridSearchCV(ridge,param_grid,cv=5)
# d)	使用训练集训练数据
grid_search.fit(X_train,y_train)
# e)	打印最优得分，和最优参数
print(grid_search.best_score_)
print(grid_search.best_params_)

# 8、	使用最优参数，创建L2模型，训练数据，进行预测，打印mse，和R方（10分）
ridge = Ridge(alpha=1)
ridge.fit(X_train,y_train)
pred_test = ridge.predict(X_test)
print('mse:', mean_squared_error(y_test, pred_test))
print('r2:', r2_score(y_test, pred_test))

# 9、	说明L1正则和L2正则区别（10分）


